"""
STS工具函数模块
提供常用的辅助功能
"""

import re
import time
from typing import Optional, Tuple
from datetime import datetime


class STSUtils:
    """STS工具函数类"""
    
    @staticmethod
    def validate_meter_id(meter_id: str) -> bool:
        """
        验证表计ID格式
        
        Args:
            meter_id: 表计ID
            
        Returns:
            格式是否有效
        """
        # 表计ID应该是数字，长度在6-12位之间
        if not meter_id.isdigit():
            return False
        
        if len(meter_id) < 6 or len(meter_id) > 12:
            return False
        
        return True
    
    @staticmethod
    def validate_amount(amount: int) -> bool:
        """
        验证充值金额
        
        Args:
            amount: 充值金额（以分为单位）
            
        Returns:
            金额是否有效
        """
        # 金额应该大于0且不超过最大值
        if amount <= 0:
            return False
        
        # 最大金额限制（例如：99999999分 = 999999.99元）
        if amount > 99999999:
            return False
        
        return True
    
    @staticmethod
    def format_amount(amount_cents: int) -> str:
        """
        格式化金额显示
        
        Args:
            amount_cents: 金额（以分为单位）
            
        Returns:
            格式化后的金额字符串
        """
        yuan = amount_cents // 100
        fen = amount_cents % 100
        
        if fen == 0:
            return f"{yuan}元"
        else:
            return f"{yuan}.{fen:02d}元"
    
    @staticmethod
    def parse_amount(amount_str: str) -> Optional[int]:
        """
        解析金额字符串
        
        Args:
            amount_str: 金额字符串（如"100.50元"）
            
        Returns:
            金额（以分为单位）
        """
        try:
            # 移除"元"字符
            clean_str = amount_str.replace('元', '').strip()
            
            # 检查是否包含小数点
            if '.' in clean_str:
                yuan, fen = clean_str.split('.')
                yuan = int(yuan)
                fen = int(fen)
                
                # 确保分不超过99
                if fen > 99:
                    return None
                
                return yuan * 100 + fen
            else:
                return int(clean_str) * 100
                
        except (ValueError, AttributeError):
            return None
    
    @staticmethod
    def generate_transfer_counter() -> int:
        """
        生成传输计数器
        
        Returns:
            传输计数器值
        """
        # 使用时间戳的低16位作为传输计数器
        return int(time.time()) & 0xFFFF
    
    @staticmethod
    def format_timestamp(timestamp: Optional[float] = None) -> str:
        """
        格式化时间戳
        
        Args:
            timestamp: 时间戳，如果为None则使用当前时间
            
        Returns:
            格式化的时间字符串
        """
        if timestamp is None:
            timestamp = time.time()
        
        dt = datetime.fromtimestamp(timestamp)
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    
    @staticmethod
    def clean_token_string(token: str) -> str:
        """
        清理令牌字符串
        
        Args:
            token: 原始令牌字符串
            
        Returns:
            清理后的令牌字符串
        """
        # 移除所有空格、连字符和其他分隔符
        return re.sub(r'[^0-9A-Fa-f]', '', token).upper()
    
    @staticmethod
    def split_token_into_groups(token: str, group_size: int = 4) -> list:
        """
        将令牌分割成组
        
        Args:
            token: 令牌字符串
            group_size: 每组的大小
            
        Returns:
            分组后的令牌列表
        """
        clean_token = STSUtils.clean_token_string(token)
        return [clean_token[i:i+group_size] for i in range(0, len(clean_token), group_size)]
    
    @staticmethod
    def calculate_checksum(data: bytes) -> int:
        """
        计算简单的校验和
        
        Args:
            data: 数据字节
            
        Returns:
            校验和
        """
        return sum(data) & 0xFF
    
    @staticmethod
    def verify_checksum(data: bytes, expected_checksum: int) -> bool:
        """
        验证校验和
        
        Args:
            data: 数据字节
            expected_checksum: 期望的校验和
            
        Returns:
            校验是否通过
        """
        calculated_checksum = STSUtils.calculate_checksum(data)
        return calculated_checksum == expected_checksum
    
    @staticmethod
    def hex_to_bytes(hex_string: str) -> bytes:
        """
        十六进制字符串转字节
        
        Args:
            hex_string: 十六进制字符串
            
        Returns:
            字节数据
        """
        clean_hex = STSUtils.clean_token_string(hex_string)
        return bytes.fromhex(clean_hex)
    
    @staticmethod
    def bytes_to_hex(data: bytes) -> str:
        """
        字节转十六进制字符串
        
        Args:
            data: 字节数据
            
        Returns:
            十六进制字符串
        """
        return data.hex().upper()
    
    @staticmethod
    def create_log_message(operation: str, meter_id: str, 
                          amount: Optional[int] = None, 
                          status: str = "SUCCESS") -> str:
        """
        创建日志消息
        
        Args:
            operation: 操作类型
            meter_id: 表计ID
            amount: 金额（可选）
            status: 操作状态
            
        Returns:
            格式化的日志消息
        """
        timestamp = STSUtils.format_timestamp()
        message = f"[{timestamp}] {operation} - Meter: {meter_id}"
        
        if amount is not None:
            amount_str = STSUtils.format_amount(amount)
            message += f" - Amount: {amount_str}"
        
        message += f" - Status: {status}"
        
        return message
